#include "ListaReporte.h"

void TlistaReporte_Crear(struct TlistaReporte *LR, size_t tamanio){
    L_Crear(&(LR->ListaSimple), tamanio);
}

void TlistaReporte_Vaciar(struct TlistaReporte *LR){
    struct Reporte corriente;

    while(!L_Vacia(LR->ListaSimple)){
        L_Mover_Cte(&(LR->ListaSimple), L_Primero);
        L_Elem_Cte(LR->ListaSimple,&corriente);

        free(corriente.Usuario);
        L_Borrar_Cte(&(LR->ListaSimple));
    }
}

int TlistaReporte_Vacia(struct TlistaReporte *LR){
    return L_Vacia(LR->ListaSimple);
}

int TlistaReporte_Insertar(struct TlistaReporte *LR,struct Reporte Reporte){
    struct Reporte corriente;

/** Si la lista esta vacia, inserto el elemento primero*/
    if(L_Vacia(LR->ListaSimple))
        return L_Insertar_Cte(&(LR->ListaSimple), L_Primero, &Reporte);

/**Leo el corriente, y en caso de ser menor al elemento recibido, lo muevo al principio*/
    L_Elem_Cte(LR->ListaSimple,&corriente);

    if(strcmp(corriente.Usuario,Reporte.Usuario)>0)
        L_Mover_Cte(&(LR->ListaSimple), L_Primero);

/**Leo el corriente, y recorro la lista hasta encontrar el lugar correcto*/
    L_Elem_Cte(LR->ListaSimple,&corriente);

    while(((strcmp(corriente.Usuario,Reporte.Usuario)>0)  ||
           (strcmp(Reporte.Usuario,corriente.Usuario)==0))||
           L_Mover_Cte(&(LR->ListaSimple), L_Siguiente)){

        L_Elem_Cte(LR->ListaSimple,&corriente);
        if(strcmp(Reporte.Usuario,corriente.Usuario)<0)
            break;
        if(strcmp(Reporte.Usuario,corriente.Usuario)==0)
            break;
    }

    if(strcmp(Reporte.Usuario,corriente.Usuario)==0){
        Reporte.CantTweets = ++corriente.CantTweets;
        free(corriente.Usuario);
        L_Borrar_Cte(&(LR->ListaSimple));

        if(L_Vacia(LR->ListaSimple))
            return L_Insertar_Cte(&(LR->ListaSimple), L_Primero, &Reporte);

        L_Elem_Cte(LR->ListaSimple,&corriente);
    }

    return (strcmp(Reporte.Usuario,corriente.Usuario)<0)?
        L_Insertar_Cte(&(LR->ListaSimple), L_Anterior, &Reporte):
        L_Insertar_Cte(&(LR->ListaSimple), L_Siguiente, &Reporte);

}

int TlistaReporte_Imprimir(struct TlistaReporte *LR){

    struct Reporte corriente;

    L_Mover_Cte(&(LR->ListaSimple), L_Primero);
    L_Elem_Cte(LR->ListaSimple,&corriente);
    if(corriente.CantTweets>=2)
        printf("%s:  %d\n",corriente.Usuario ,corriente.CantTweets);

    while(L_Mover_Cte(&(LR->ListaSimple), L_Siguiente)){
        L_Elem_Cte(LR->ListaSimple,&corriente);
        if(corriente.CantTweets>=2)
            printf("%s:  %d\n",corriente.Usuario, corriente.CantTweets);
    }

    return 0;
}


